home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / dskut / pdisk.zip / DOTRANS.ASM < prev    next >
Assembly Source File  |  1989-01-12  |  2KB  |  118 lines

  1.     PAGE    64D,132D    ; make line length 132
  2.     SUBTTL    Read and Write sectors
  3. %    .MODEL    memmodel,C
  4. ;    .286
  5.     .radix  16
  6.     OK186    EQU (@Cpu and 02)
  7.  
  8. IFE    @DataSize 
  9.     EXTRN    master_boot_rec:Word, part_boot_rec:Word    ; actually ptrs
  10.     EXTRN    fixed_disk:BYTE, _numsecs:BYTE, _shprod:WORD
  11. Else
  12. RDPART_DATA Segment Para 'FAR_DATA'
  13.     EXTRN    master_boot_rec:Dword, part_boot_rec:Dword    ; actually ptrs
  14.     EXTRN    fixed_disk:BYTE, _numsecs:BYTE, _shprod:WORD
  15. RDPART_DATA ENDS
  16. Endif
  17.     .code
  18.     Assume    DS:RDPART_DATA
  19. ; int dotrans(dword relsect, word startsec, char *buf, char sects, char op);
  20. dotrans PROC    Uses ES DI,relseclow,relsechigh,startsec,buf:ptr,sects:byte,op:byte
  21. IF    @DataSize 
  22.     push    ds
  23.     mov        ax,SEG master_boot_rec
  24.     mov        ds,ax
  25. Endif
  26.     MOV    AX,relseclow
  27.     MOV    DX,relsechigh
  28.     ADD    AX,startsec    ; offset of starting sector
  29.     ADC    DX,0
  30.     DIV    [_shprod]    ; secs_per_track*heads_per_cyl
  31.     MOV    CH,AL
  32. IF    OK186
  33.     SHL    AH,6
  34. ELSE
  35.     MOV    CL,6
  36.     SHL    AH,CL
  37. ENDIF
  38.     MOV    CL,AH
  39.     MOV    AX,DX
  40.     DIV    [_numsecs]    ; secs_per_track
  41.     MOV    DH,AL
  42.     INC    AH    ; sector number is 1 based, not 0 based (from MOD)
  43.     OR    CL,AH
  44.     MOV    DL,[fixed_disk]
  45.     MOV    AL,sects
  46.     MOV    AH,op
  47. IFE    @DataSize 
  48.     MOV    AX,DS
  49.     MOV    ES,AX
  50.     MOV    BX,buf
  51. Else
  52.     LES    BX,buf
  53. Endif
  54.     INT    13
  55.     mov    ax,0
  56.     jnc    @f
  57.     mov ax,-1
  58. @@:
  59. IF @DataSize
  60.     pop ds
  61. Endif
  62.     RET
  63. dotrans    ENDP
  64.  
  65. boot_transfer    proc    USES ES DI, mode:Byte, idx
  66. IFE    @DataSize 
  67.     mov    ax,ds
  68.     mov    es,ax
  69. Else
  70.     push    ds
  71.     mov        ax,SEG master_boot_rec
  72.     mov        ds,ax
  73. Endif
  74.     mov    dl,fixed_disk
  75.     mov    di,idx
  76.     or    di,di
  77.     jz    domaster
  78.     dec    di
  79.     shl    di,1
  80. IFE    @DataSize 
  81.     mov    bx,[di].part_boot_rec ; but ptrs are only 2 bytes wide
  82.     shl    di,1
  83. Else
  84.     shl    di,1                    ; ptrs are 4 bytes wide
  85.     les    bx,[di].part_boot_rec
  86. Endif
  87.     shl    di,1            ; boot parm table in master_boot_rec is 0x10 bytes wide
  88.     shl    di,1
  89.     add    di,Word Ptr [master_boot_rec]
  90. IF @DataSize
  91.     mov    ds,Word Ptr [master_boot_rec+2]
  92. Endif
  93.     mov    cx,word ptr [di+1be+2]
  94.     mov    dh,byte ptr [di+1be+1]
  95.     jmp    short @F
  96. domaster:
  97. IFE    @DataSize 
  98.     mov    bx,[master_boot_rec]
  99. Else
  100.     les    bx,[master_boot_rec]
  101. Endif
  102.     mov    cx,1
  103.     xor    dh,dh
  104. @@:
  105.     mov    ah,mode
  106.     mov    al,1            ; read/write 1 sector
  107.     int    13
  108.     mov    ax,0
  109.     jnc    @f
  110.     mov ax,-1
  111. @@:
  112. IF @DataSize
  113.     pop ds
  114. Endif
  115.     ret
  116. boot_transfer    endp
  117.     END
  118.